﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;


 public class CatturaSchermo
    {
        #region variabili
			protected static IntPtr m_HBitmap;
		#endregion
        
		#region Funzioni di Classe

        #region GetDesktopImage
            /// <summary>
	/// Mi restituisce un immagine dello schermo usando le funzioni delle dll user32 e gdi32
	/// </summary>
	/// <returns></returns>
     public static Bitmap GetDesktopImage()
		{
           
			//dimensione schermo
			USER32.SIZE  size;
			
			//Ottengo HDC dello schermo dall'HWND passatogli (potevo anche mettere NULL)
			IntPtr 	hDC = USER32.GetDC(USER32.GetDesktopWindow()); 

			//Creo un HDC in memoria dove memorizzare l'immagine
			IntPtr hMemDC = GDI32.CreateCompatibleDC(hDC);
			
			//Ottengo le dimensioni dello schermo.
			size.cx = USER32.GetSystemMetrics(USER32.SM_CXSCREEN);
			size.cy = USER32.GetSystemMetrics(USER32.SM_CYSCREEN);
			
			//Creo una bitmap compatibile all'hdc e di dimesnioni pari allo schermo
			m_HBitmap = GDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

			if (m_HBitmap!=IntPtr.Zero)
			{
				
				IntPtr hOld = (IntPtr) GDI32.SelectObject(hMemDC, m_HBitmap);
				//Copio nella bitmap il contesto Grafico
				GDI32.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, GDI32.SRCCOPY);
				         
				GDI32.SelectObject(hMemDC, hOld);
				//cancello il contesto grafuco in memoria.
				GDI32.DeleteDC(hMemDC);
				//Rilascio il contesto grafico dello schermo
               
				USER32.ReleaseDC(USER32.GetDesktopWindow(), hDC);
				//Creo l'immagine voluta tramite il metodo sottostante.			
                Bitmap b = System.Drawing.Image.FromHbitmap(m_HBitmap);
                GDI32.DeleteObject(m_HBitmap);               
               return b;
			}
			//If m_HBitmap is null retunrn null.
			return null;
		}
     #endregion


        #region GetImageFromHwnd
     /// <summary>
     /// Mi restituisce l'immagine dell'hwnd passato 
     /// </summary>
     /// <param name="Hwnd"></param>
     /// <returns></returns>
     public static Bitmap GetImageFromHwnd(IntPtr Hwnd)
     {
         //int t1 = DateTime.Now.Millisecond;
         Bitmap b;
         //dimensione schermo
         USER32.SIZE size;

         //Ottengo HDC dello schermo dall'HWND passatogli (potevo anche mettere NULL e nel caso sarebbe lo schermo)
         IntPtr hDC = USER32.GetDC(Hwnd);
         if (hDC==IntPtr.Zero)
             return null;
         //Creo un HDC in memoria dove memorizzare l'immagine
         IntPtr hMemDC = GDI32.CreateCompatibleDC(hDC);

         //Ottengo le dimensioni dello della finestra.        
         Rectangle rect;
         USER32.GetClientRect(Hwnd, out rect);
         size.cx = rect.Width;
         size.cy = rect.Height;


         //Creo una bitmap compatibile all'hdc e di dimesnioni pari allo schermo
         m_HBitmap = GDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

         if (m_HBitmap != IntPtr.Zero)
         {
             IntPtr hOld = (IntPtr)GDI32.SelectObject(hMemDC, m_HBitmap);
             //Copio nella bitmap il contesto Grafico
             GDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, GDI32.SRCCOPY);
             GDI32.SelectObject(hMemDC, hOld);
             //cancello il contesto grafuco in memoria.
             GDI32.DeleteDC(hMemDC);
             //Rilascio il contesto grafico dello schermo
             USER32.ReleaseDC(Hwnd, hDC);
             //Creo l'immagine voluta tramite il metodo sottostante.
             GDI32.DeleteObject(hOld);
             b = System.Drawing.Image.FromHbitmap(m_HBitmap);
             GDI32.DeleteObject(m_HBitmap); // libero la memoria 
             //int t2 = DateTime.Now.Millisecond - t1;
             //Console.WriteLine("Tempo getImage: " + t2);
             return b;
         }
         //If m_HBitmap is null retunrn null.

         return null;
     }
     #endregion
        
        #endregion
    }
    

